package com.vehiclesecure.security;

import org.springframework.stereotype.Service;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * 车辆安全服务类，负责车辆数据的安全验证和传输相关逻辑
 */
@Service
public class VehicleSecurityService {
    
    private static final String HMAC_ALGORITHM = "HmacSHA256";
    private final SecretKeySpec secretKeySpec;
    
    public VehicleSecurityService() {
        // 在实际应用中，密钥应该从配置文件或环境变量中读取
        String secretKey = "vehicle-security-secret-key-keep-it-safe";
        this.secretKeySpec = new SecretKeySpec(secretKey.getBytes(), HMAC_ALGORITHM);
    }
    
    /**
     * 生成数据签名，用于验证数据完整性和来源
     * @param data 要签名的数据
     * @return Base64编码的签名字符串
     */
    public String generateDataSignature(String data) {
        try {
            Mac mac = Mac.getInstance(HMAC_ALGORITHM);
            mac.init(secretKeySpec);
            byte[] signatureBytes = mac.doFinal(data.getBytes());
            return Base64.getEncoder().encodeToString(signatureBytes);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to generate data signature", e);
        }
    }
    
    /**
     * 验证数据签名是否有效
     * @param data 原始数据
     * @param signature 要验证的签名
     * @return 签名是否有效
     */
    public boolean verifyDataSignature(String data, String signature) {
        try {
            String generatedSignature = generateDataSignature(data);
            return generatedSignature.equals(signature);
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 验证设备身份
     * @param deviceId 设备ID
     * @param deviceToken 设备令牌
     * @return 设备是否已授权
     */
    public boolean authenticateDevice(String deviceId, String deviceToken) {
        // 实际应用中应该从数据库或安全存储中验证设备身份
        // 这里使用简化的验证逻辑
        return deviceToken != null && deviceToken.startsWith("valid-token-");
    }
    
    /**
     * 检查车辆是否处于安全状态
     * @param vehicleId 车辆ID
     * @param currentStatus 当前状态数据
     * @return 车辆是否处于安全状态
     */
    public boolean isVehicleInSafeState(String vehicleId, String currentStatus) {
        // 实现车辆安全状态检查逻辑
        // 例如检查门是否锁定、引擎是否关闭等
        return currentStatus != null && !currentStatus.contains("tamper") && !currentStatus.contains("emergency");
    }
}